有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在tomcat7上运行shell脚本

为了修复tomcat7服务器的文件权限,我已经绞尽脑汁两天了。我有一个库类(.jar文件包含在myapp/WEB-INF中),它需要运行shell脚本。该库由我编写,在NetBeans ie中运行良好。在创建、读取和删除文件方面没有任何麻烦。这是因为NetBeans以blumonkey(我在Ubuntu系统上的用户名)的身份运行该程序。但当我将其导入tomcat并运行它时,tomcat“执行”命令,不产生明确的输出,尝试检查文件(脚本成功时将生成该文件),并抛出FileNotFoundException

详情如下:

  • Tomcat7使用apt get安装,其数据位于两个位置-/var/lib/Tomcat7和conf和webapps文件夹,以及/usr/share/Tomcat7和bin和lib文件夹
  • 用户上传一个文件。存储到/home/blumonkey/data的zip文件。程序的其余部分在存储在此处的文档上运行。显然,tomcat上传的所有新文件夹/文件的所有者都是tomcat7
  • 我尝试过将所有权更改为blumonkey,将tomcat7添加到blumonkey用户组,但没有一种方法奏效(在这里的某个地方,我可能不小心将更改权限弄糟了:/)。显然,tomcat7无法处理其拥有的文件。(这怎么可能?)
  • 当我在终端中运行脚本时,它会工作。但是当我运行sudo -u tomcat7 script.sh时,它就不起作用了。它只是在没有消息的情况下退出。我怀疑这是否是正在发生的事情,因为我试图通过重定向ProcessBuilder中的错误和输出进行调试,但结果是空的

任何关于如何解决问题并使脚本运行的帮助都将不胜感激。如果您需要更多信息,请发表评论

用于脚本执行的代码

     private static void RunShellCommandFromJava(String command,String fn, String arg1,String arg2) throws Exception
   {
  try
    {
         System.out.println(System.getProperty("user.name")); 
         ProcessBuilder pbuilder = new ProcessBuilder("/bin/bash",command,fn,arg1,arg2);
         System.out.println(pbuilder.command());
            pbuilder.redirectErrorStream(true);
            Process p = pbuilder.start();
        p.waitFor();
    }
    catch(Exception ie)
    {
        throw ie;
    }
}

需要执行的命令

"/bin/bash /abs/path/to/script.sh  /abs/path/to/doc/in/data-folder maxpages=30 maxsearches=3"

PS:我已经回答了this问题,但没有帮助。我还尝试了其他选项,如Runtime.exec()bash/bin/bash//bin/bash/ -c,其中一些根本不起作用,另一些则没有结果


共 (1) 个答案

  1. # 1 楼答案

    尝试使用Runtime并检查标准错误以找出问题所在(可能是权限或路径):

    // run command
    String[] fixCmd = new String[] { "/bin/bash", "/abs/path/to/script.sh", "/abs/path/to/doc/in/data-folder", "maxpages=30", "maxsearches=3" };
    Process start = Runtime.getRuntime().exec(fixCmd);
    
    // monitor standard error to find out what's wrong
    BufferedReader r = new BufferedReader(new InputStreamReader(start.getErrorStream()));
    String line = null;
    while ((line = r.readLine()) != null) {
        System.out.println(line);
    }